﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Data.Linq.Mapping;
using Quiz.LINQData;

namespace Quiz
{
    class Spielklasse : IDisposable
    {


        #region Member
           private List<int> _alleFragenIDs;
           private DataBase _datenbank;
           private Random _randomNumber;
        #endregion
        
        #region Properties
            /// <summary>
            /// Gibt eine Liste mit allen FrageIDs die noch nicht abgefragt wurden zurück
            /// </summary>
            public List<int> AlleFragenIDs
            {
                get { return _alleFragenIDs; }
                set { _alleFragenIDs = value; }
            }

            /// <summary>
            /// Die DB Connection für die Abfragen
            /// </summary>
            public DataBase Datenbank
            {
                get { return _datenbank; }
                set { _datenbank = value; }
            }
            
            /// <summary>
            /// Zur Generierung einer RandomZahl um eine Zufallsfrage aus einer Liste auszuwählen
            /// </summary>
            private Random RandomNumber
            {
                get { return _randomNumber; }
                set { _randomNumber = value; }
            }
        #endregion


        #region Konstruktor
            /// <summary>
            /// Initialisieren der Spielklasse
            /// </summary>
            public Spielklasse()
            {
                //Initialisieren aller wichtigen "Variablen" für das Quiz
                _alleFragenIDs = new List<int>();
                _datenbank = new DataBase();
                _randomNumber = new Random();
             }
        #endregion


        #region Functions/Subs
              /// <summary>
            /// Lädt alle zur Verfügung stehenden FrageIDs aus der Datenbank, damit diese später mittels Random durchlaufen werden können.
            /// Sobald eine Frage gestellt wurde, wird die ID aus der Liste entfernt. Wenn sich keine IDs mehr in der Liste befinden, muss die Liste neu geladen werden.
            /// </summary>
            private void AlleFrageIDsLaden()
            {
                
                //Eine Abfrage erstellen mit der alle FrageIDs aus der Datenbank abgerufen werden, die Angezeigt werden sollen.
                var query = from frage in Datenbank.Fragen where frage.Kategorie.Anzeigen select frage.FrageID;

                foreach (int id in query)
                {
                    //Wenn die FrageID noch nicht in der Liste ist, diese ID hinzufügen
                   if (AlleFragenIDs.Contains(id) != true)
                   {
                       AlleFragenIDs.Add(id);
                   }
                }
            }

            /// <summary>
            /// Gibt eine Randomfrage aus den aktuellen FrageIDs zurück
            /// </summary>
            /// <returns>Gibt eine Randomfrage zurück, bei einem Fehler wird NULL zurück gegeben</returns>
            public Frage GetNewRandomFrage()
            {
                //Prüfen ob noch Fragen in der Liste enthalten sind, wenn nicht die Frageliste neu laden
                if (AlleFragenIDs.Count == 0)
                {
                    AlleFrageIDsLaden();
                }


                if (AlleFragenIDs.Count > 0)
                {
                    //Query der durch Zufall eine Frage aus aus der Datenbank hohlt anhand der Liste der hinterlegten FrageIDs
                    var query = from frage in Datenbank.Fragen
                                where
                                    frage.FrageID == AlleFragenIDs.ElementAt(_randomNumber.Next(0, AlleFragenIDs.Count))
                                select frage;

                    foreach (Frage frage in query)
                    {
                        if (frage != null)
                        {
                            //Die FrageID die zurückgegeben wurde aus der Liste der zur Verüfung stehenden FrageIDs löschen
                            AlleFragenIDs.Remove(frage.FrageID);
                            //Die passende Frage zurückgeben
                            return frage;
                        }
                        else
                        {
                            //TODO Exception "werfen" 
                        }
                    }
                }
                return null;
            }

            /// <summary>
            /// Verwerfen der DB-Verbindung
            /// </summary>
            void IDisposable.Dispose()
            {
                _datenbank.Dispose();
            }
        #endregion

            
    }
}
